'''
自定义传统身份认证后端，实现可以使用手机号登录
'''

from django.contrib.auth.backends import ModelBackend
from users.models import User
class UsernameMobileAuthBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        '''
        重新写认证函数，实现可以使用用户名或者手机号登录
        :param request:请求对象
        :param username:用户名或者手机号
        :param password:密码
        :param kwargs:
        :return:用户对象或者None
        '''
        # 先按照用户名查找，再按照手机号去查找
        try:
            # 先按照用户名查找
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            # 用户名未找到，再按照手机号来查找
            try:
                user = User.objects.get(mobile=username)
            except User.DoesNotExist:
            # 1.两个都找不到---->用户不存在
                return None
        # 2. 根据用户名来验证密码
        if not user.check_password(password):
            return None

        # 假如有一个验证成功，返回用户对象
        return user